Java-তে Polymorphic Data Structures মানে এমন ডেটা স্ট্রাকচার যা একাধিক টাইপের অবজেক্ট ধারণ করতে পারে। Jackson লাইব্রেরি এ ধরনের ডেটা Serialize এবং Deserialize করার জন্য সহজ পদ্ধতি সরবরাহ করে।
1. Polymorphic Serialization/Deserialization সমস্যা
যখন কোনো প্যারেন্ট ক্লাসের মাধ্যমে চাইল্ড ক্লাসগুলোকে হ্যান্ডল করতে হয়, তখন Serialize বা Deserialize করার সময় ক্লাসের সঠিক টাইপ নির্ধারণ করা জটিল হতে পারে।
Jackson এই সমস্যার সমাধান করে @JsonTypeInfo এবং @JsonSubTypes অ্যানোটেশন ব্যবহার করে।
2. উদাহরণ: Polymorphic Data Structure
ধরা যাক, আমাদের কাছে একটি Shape ইন্টারফেস বা প্যারেন্ট ক্লাস রয়েছে এবং তার দুইটি চাইল্ড ক্লাস Circle এবং Rectangle।
প্যারেন্ট ও চাইল্ড ক্লাস তৈরি
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
// প্যারেন্ট ক্লাস বা ইন্টারফেস
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, // টাইপের আইডেন্টিফায়ার হিসেবে টাইপের নাম ব্যবহার হবে
include = JsonTypeInfo.As.PROPERTY, // টাইপের তথ্য JSON-এর একটি প্রপার্টি হিসেবে যোগ হবে
property = "type" // টাইপের প্রপার্টির নাম
)
@JsonSubTypes({
@JsonSubTypes.Type(value = Circle.class, name = "circle"),
@JsonSubTypes.Type(value = Rectangle.class, name = "rectangle")
})
abstract class Shape {
private String color;
// Constructors, Getters, and Setters
public Shape() {}
public Shape(String color) {
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Shape{color='" + color + "'}";
}
}
// চাইল্ড ক্লাস ১: Circle
class Circle extends Shape {
private double radius;
public Circle() {}
public Circle(String color, double radius) {
super(color);
this.radius = radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
@Override
public String toString() {
return "Circle{" + "color='" + getColor() + '\'' + ", radius=" + radius + '}';
}
}
// চাইল্ড ক্লাস ২: Rectangle
class Rectangle extends Shape {
private double length;
private double width;
public Rectangle() {}
public Rectangle(String color, double length, double width) {
super(color);
this.length = length;
this.width = width;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
@Override
public String toString() {
return "Rectangle{" + "color='" + getColor() + '\'' + ", length=" + length + ", width=" + width + '}';
}
}
3. Serialization এবং Deserialization
Serialization: Polymorphic Object থেকে JSON
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.List;
public class PolymorphicSerializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Polymorphic objects তৈরি
List<Shape> shapes = new ArrayList<>();
shapes.add(new Circle("Red", 5.5));
shapes.add(new Rectangle("Blue", 4.0, 6.0));
// Serialize
String json = mapper.writeValueAsString(shapes);
System.out.println("Serialized JSON: " + json);
}
}
আউটপুট:
[
{
"type": "circle",
"color": "Red",
"radius": 5.5
},
{
"type": "rectangle",
"color": "Blue",
"length": 4.0,
"width": 6.0
}
]
Deserialization: JSON থেকে Polymorphic Object
public class PolymorphicDeserializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = """
[
{
"type": "circle",
"color": "Red",
"radius": 5.5
},
{
"type": "rectangle",
"color": "Blue",
"length": 4.0,
"width": 6.0
}
]
""";
// Deserialize
List<Shape> shapes = mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, Shape.class));
for (Shape shape : shapes) {
System.out.println("Deserialized Shape: " + shape);
}
}
}
আউটপুট:
Deserialized Shape: Circle{color='Red', radius=5.5}
Deserialized Shape: Rectangle{color='Blue', length=4.0, width=6.0}
4. টিপস এবং গুরুত্বপূর্ণ বিষয়
@JsonTypeInfoএবং@JsonSubTypesব্যবহার করুন:@JsonTypeInfoJSON ডকুমেন্টে টাইপ সম্পর্কিত তথ্য যোগ করে।@JsonSubTypesচাইল্ড টাইপগুলোর নাম ও ক্লাস ম্যাপিং করে।
- Type Identifier কাস্টমাইজেশন: যদি
typeপ্রপার্টি না চান বা কাস্টম টাইপ ব্যবহার করতে চান, তা@JsonTypeInfoকনফিগার করে করা যায়। - Interface বা Abstract Class:
Shapeযদি ইন্টারফেস হয়, তাহলেও একইভাবে কাজ করবে। - Collection Handling: Collection টাইপের অবজেক্ট Serialize বা Deserialize করার সময় সঠিক টাইপ নিশ্চিত করতে হবে।
5. Use Cases
- Inheritance Models: যখন একাধিক চাইল্ড ক্লাস প্যারেন্ট ক্লাসের মাধ্যমে এক্সপোজ করতে হয়।
- API Development: REST API-তে ডায়নামিক ডেটা টাইপ হ্যান্ডল করতে।
- Configuration Systems: কনফিগারেশন ফাইলের ডেটা বিভিন্ন সাবটাইপে বিভক্ত থাকলে।
Polymorphic Data Structure হ্যান্ডল করার জন্য Jackson একটি শক্তিশালী এবং সহজ সরঞ্জাম। @JsonTypeInfo এবং @JsonSubTypes ব্যবহার করে JSON ডেটায় টাইপের তথ্য যোগ করা যায়, যা সহজেই Serialize এবং Deserialize করা সম্ভব।
আরও উদাহরণ বা নির্দিষ্ট কোনো সমস্যার সমাধান জানতে চাইলে জানাতে পারেন! 😊
Read more